#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <memory.h>

// #define MAX_THREADS 128 // 最大支持的线程数量
#define MAX_THREADS 1000 // 最大支持的线程数量

long long g_val = 0; // 主线程计数器
long long g_val_threads[MAX_THREADS] = {0}; // 每个线程的独立累加器
int nr_thread = 0; // 线程数量

void handler(int signo) {
    long long total = g_val; // 主线程的累加值
    for (int i = 0; i < nr_thread; ++i) {
        total += g_val_threads[i]; // 累加所有线程的值
    }
    printf("Total: %lld\n", total);
    exit(0); // 进程退出
}

void *routine(void *arg) {
    int thread_id = *(int *)arg; // 获取线程编号
    free(arg); // 释放动态分配的内存
    while (1) {
        ++g_val_threads[thread_id]; // 累加到对应线程的计数器
    }
    return NULL;
}

int main() {
    signal(SIGALRM, handler);
    scanf("%d", &nr_thread);

    if (nr_thread > MAX_THREADS) {
        fprintf(stderr, "Thread count exceeds MAX_THREADS (%d)\n", MAX_THREADS);
        return 1;
    }

    alarm(1); // 设置 1 秒的定时器

    pthread_t tids[MAX_THREADS];
    for (int i = 0; i < nr_thread; ++i) {
        int *thread_id = (int*)malloc(sizeof(int)); // 为线程编号分配动态内存
        if (!thread_id) {
            perror("malloc failed");
            return 1;
        }
        *thread_id = i;
        pthread_create(&tids[i], NULL, routine, thread_id);
    }

    while (1) {
        ++g_val; // 主线程的累加器
    }

    // ????? 类似 g_val = g_val ? g_val : g_val/2
    g_val = g_val ? : g_val / 2;
    return 0;
}
// private:
//     int a = 0;


// long long g_val = 0;
// long long g_val_thread = 0;

// void handler(int signo){
//     printf("%lld\n",g_val + g_val_thread);
//     // 进程（LWP）全部退出
//     exit(0);
// }

// void *routine1(void* args){
//     while(true){
//         // 不是原子的
//         // ++g_val;
//         // __sync_fetch_and_add(&g_val, 1);
//         ++g_val_thread;
//     }
// }


// // 双核CPU测试  线程对于计算密集型程序的影响
// int main(){
//     signal(SIGALRM, handler);
//     int nr_thread = 0; scanf("%d", &nr_thread);

//     alarm(1);
//     for(int i = 0; i < nr_thread; ++i){
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine1, (void*)"new-thread");
//     }
//     while(true){
//         ++g_val;
//         // __sync_fetch_and_add(&g_val, 1);
//     }

//     return 0;
// }